]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
extensionSystem: Sort extensions before loading
authorSundeep Mediratta <smedius@gmail.com>
Wed, 11 Oct 2023 10:31:19 +0000 (06:31 -0400)
committerMarge Bot <marge-bot@gnome.org>
Sat, 16 Dec 2023 17:33:47 +0000 (17:33 +0000)
When an extension is disabled, we "rebase" all extensions that
were enabled afterwards, in case they override the same method.

This can be fairly expensive, in particular when disabling many
extensions at once, for instance when locking the screen.

Help with that by sorting extensions by the number of session-modes,
as extensions that support multiple modes are less likely to be
disabled on session mode changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2851>

js/ui/extensionSystem.js

index 3592e5b3a957dcda2a1b7d28707d25c16605ce79..a03d0f10f2f5c696363545fcd0fea07252195e63 100644 (file)
@@ -583,6 +583,8 @@ export class ExtensionManager extends Signals.EventEmitter {
         if (!global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY))
             extensions = extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY));
 
+        extensions.sort((a, b) => this._compareExtensions(this.lookup(a), this.lookup(b)));
+
         // filter out 'disabled-extensions' which takes precedence
         let disabledExtensions = global.settings.get_strv(DISABLED_EXTENSIONS_KEY);
         return extensions.filter(item => !disabledExtensions.includes(item));
@@ -700,6 +702,12 @@ export class ExtensionManager extends Signals.EventEmitter {
         }
     }
 
+    _compareExtensions(a, b) {
+        const modesA = a?.sessionModes ?? [];
+        const modesB = b?.sessionModes ?? [];
+        return modesB.length - modesA.length;
+    }
+
     async _loadExtensions() {
         global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, () => {
             this._onEnabledExtensionsChanged();
@@ -748,7 +756,7 @@ export class ExtensionManager extends Signals.EventEmitter {
             }
 
             return extension;
-        }).filter(extension => extension !== null);
+        }).filter(extension => extension !== null).sort(this._compareExtensions.bind(this));
 
         // after updating to a new major version,
         // update extensions before loading them